﻿// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "FLL/chapter7/遮罩纹理"
{
    Properties
    {
        _Specular("[高光颜色] specular",Color)=(1,1,1,1)
        _Color("[漫反射颜色] color tint",Color)=(1,1,1,1)
        _Gloss("[光泽度] gloss",Range(8.0,256))=20

        _MainTex("[主纹理] maintex",2D)="white"{}
        _BumpMap("[法线纹理] normalmap",2D)="bump"{}
        _BumpScale("[纹理凹凸程度] bumpscale",Float)=1.0
        _SpecularMask("[高光遮罩] specular_mash",2D)="white"{}
        _SpecularScale("[遮罩影响度] specularscale",Float)=1.0
    

    }
    SubShader
    {

        Pass
        {
            Tags{"LightMode"="ForwardBase"}

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"
            #include "UnityCG.cginc"

            
            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _BumpMap;
            float _BumpScale;
            sampler2D _SpecularMask;
            float _SpecularScale;

            fixed4 _Color;
            fixed4 _Specular;
            float _Gloss; 

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal:NORMAL;
                float4 tangent:TANGENT;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv:TEXCOORD0;
                float3 lightDir:TEXCOORD1;
                float3 viewDir:TEXCOORD2;
            };

            




            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv.xy=v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;

                //选择去切线空间去计算,把光源方向的视线方向都转化到切线空间去
                TANGENT_SPACE_ROTATION;
                o.lightDir=mul(rotation,ObjSpaceLightDir(v.vertex)).xyz;
                o.viewDir=mul(rotation,ObjSpaceViewDir(v.vertex)).xyz;

                return o;
            }

            

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 tangentLightDir=normalize(i.lightDir);
                fixed3 tangentViewDir=normalize(i.viewDir);

                //采样法线贴图得到法线方向
                fixed3 tangentNormal=UnpackNormal(tex2D(_BumpMap,i.uv));
                tangentNormal.xy*=_BumpScale;
                tangentNormal.z=sqrt(1.0-saturate(dot(tangentNormal.xy,tangentNormal.xy)));

                fixed3 albedo=tex2D(_MainTex,i.uv).rgb*_Color.rgb;
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
                fixed3 diffuse=_LightColor0.rgb*albedo*max(0,dot(tangentNormal,tangentLightDir));
                fixed3 halfDir=normalize(tangentLightDir+tangentViewDir);

                //获取遮罩信息 这里只取了红色的通道
                fixed specularMask=tex2D(_SpecularMask,i.uv).r*_SpecularScale;
                //在有遮罩的情况下计算高光部分
                fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(tangentNormal,halfDir)),_Gloss)* specularMask;

                return fixed4(ambient+specular+diffuse,1.0);


            }



            ENDCG
        }
    }
    FallBack"Specular"
}
